ABC172 D - Sum of Divisors
提出
code: python
n = int(input())
def make_divisors(n):
lower_divisors , upper_divisors = [], []
i = 1
while i*i <= n:
if n % i == 0:
lower_divisors.append(i)
if i != n // i:
upper_divisors.append(n//i)
i += 1
return lower_divisors + upper_divisors::-1 ans = 0
# どこかでメモ化しないといけない
for i in range(1, n+1):
ans += i * len(make_divisors(i))
print(ans)
解答
https://scrapbox.io/files/61ca4976fa875f001d68d464.png
縦の個数がf(K)
code: python
n = int(input())
ans = 0
# 1で割り切れる数の和は1+2+...+8
# 2で割り切れる数の和は2+4+...+8
for i in range(1, n+1):
x, y = i, (n//i)*i
# 等差数列の和 = (項数*(初項+末項)) / 2
ans += ((n//i) * (x + y)) // 2
print(ans)
提出
code: python
n = int(input())
# 1つごとにforしてたら間に合わない
# 規則性はない 素因数分解で求めるなら始めからそうすればいい
# 1 -> 1
# 2 -> 2
# 3 -> 2
# 4 -> 3
# 5 -> 2
# 6 -> 4
# 7 -> 2
# 8 -> 4
# 9 -> 3